package com.lemon.smartsafety.utils.location;


import android.content.Context;

import com.baidu.location.BDLocation;
import com.baidu.location.BDLocationListener;
import com.baidu.location.LocationClient;
import com.baidu.location.LocationClientOption;
import com.lemon.smartsafety.app.IApplication;
import com.lemon.smartsafety.utils.CommonUtil;
import com.lemon.smartsafety.utils.LogUtils;
import com.lemon.smartsafety.utils.app.ToastUtil;


/**
 * 项目名称：${project_name}
 * 类名称：${type_name}
 * 类描述：
 * 创建人：Frago...
 * 创建时间：${date} ${time}
 * 修改人：${user}
 * 修改时间：${date} ${time}
 * 修改备注：
 */
public class LocationBaiDuUtils {

    public LocationClient mLocationClient = null;
    public Context mActivity = null;
    private CallBackInterface mCallBackInterface=null;
    /**
     * 定位客户端
     */
    private LocationClient m_locClient = null;

    public LocationBaiDuUtils(Context mActivity) {
        this.mActivity = mActivity;
        //声明LocationClient类
        mLocationClient=new LocationClient(mActivity);
        //注册监听函数
        mLocationClient.registerLocationListener( m_locatListener);
    }

    public  void setCallBackListen(final CallBackInterface callBackInterface){
        mCallBackInterface=callBackInterface;
    }

    //回调接口
    public interface CallBackInterface {
        public void callBackFunction(boolean Success,BDLocation location);

    }



    public void initLocation() {

        // 定位初始化
        LocationClientOption option = new LocationClientOption();
        option.setLocationMode(LocationClientOption.LocationMode.Hight_Accuracy
        );//可选，默认高精度，设置定位模式，高精度，低功耗，仅设备
        option.setCoorType("bd09ll");//可选，默认gcj02，设置返回的定位结果坐标系
        int span=1000;
        //高精度定位模式：这种定位模式下，会同时使用网络定位和GPS定位，优先返回最高精度的定位结果；
        //低功耗定位模式：这种定位模式下，不会使用GPS，只会使用网络定位（Wi-Fi和基站定位）；
        //仅用设备定位模式：这种定位模式下，不需要连接网络，只使用GPS进行定位，这种模式下不支持室内环境的定位。
        option.setLocationMode(LocationClientOption.LocationMode.Hight_Accuracy); // 设置定位模式
        option.setLocationNotify(true);//可选，默认false，设置是否当gps有效时按照1S1次频率输出GPS结果
        option.setPriority(LocationClientOption.NetWorkFirst);
        option.setScanSpan(span);//可选，默认0，即仅定位一次，设置发起定位请求的间隔需要大于等于1000ms才是有效的
        option.setIsNeedAddress(true);//可选，设置是否需要地址信息，默认不需要
        option.setOpenGps(true);//可选，默认false,设置是否使用gps
        option.setLocationNotify(true);//可选，默认false，设置是否当gps有效时按照1S1次频率输出GPS结果
        option.setIsNeedLocationDescribe(true);//可选，默认false，设置是否需要位置语义化结果，可以在BDLocation.getLocationDescribe里得到，结果类似于“在北京天安门附近”
        option.setIsNeedLocationPoiList(true);//可选，默认false，设置是否需要POI结果，可以在BDLocation.getPoiList里得到
        option.setIgnoreKillProcess(false);//可选，默认true，定位SDK内部是一个SERVICE，并放到了独立进程，设置是否在stop的时候杀死这个进程，默认不杀死
        option.SetIgnoreCacheException(false);//可选，默认false，设置是否收集CRASH信息，默认收集
        option.setEnableSimulateGps(false);//可选，默认false，设置是否需要过滤gps仿真结果，默认需要
        mLocationClient.setLocOption(option);
        mLocationClient.start();
        LogUtils.LOGE("定位开始");
    }




    //百度地图方法集合
    /**
     * 定位监听器
     */
    public BDLocationListener m_locatListener = new BDLocationListener() {
        @Override
        public void onReceiveLocation(BDLocation location) {
            try {
                LogUtils.LOGE("定位");
                if (location == null)
                    return;

                LogUtils.LOGE("定位返回:"+ IApplication.getGson().toJson(location).toString());

                // 经纬度
                double m_lat = location.getLatitude();
                double m_lon = location.getLongitude();

                LogUtils.LOGE("strLat:" + m_lat);
                LogUtils.LOGE("strLon:" + m_lon);


                String address = location.getAddrStr();
                String city = location.getCity();
                LogUtils.LOGE("City:"+city);
                LogUtils.LOGE("strAddress:"+address);


                // 注销定位监听器
                if (mLocationClient != null) mLocationClient.stop();
                if (mLocationClient != null) mLocationClient.unRegisterLocationListener(m_locatListener);

                if(CommonUtil.strIsEmpty(address)){
                    try {
                        //delete by Andrew.yin 2017/9/21 begin
                        //ToastUtil.show("获取位置信息失败，请检查权限或网络");
                        //delete by Andrew.yin 2017/9/21 end
                    } catch (Exception e) {
                        e.printStackTrace();
                    }
                    return;
                }

                mCallBackInterface.callBackFunction(true,location);

                return;

            } catch (Exception e) {
                e.printStackTrace();
            }

            try {
                if (location == null)
                    return;

            } catch (Exception e) {
                e.printStackTrace();
            }
        }


        public void onReceivePoi(BDLocation bdLocation) {

        }
    };



    public void onDestroy() {
        // 注销定位监听器
        if (mLocationClient != null) mLocationClient.stop();
        if (mLocationClient != null) mLocationClient.unRegisterLocationListener(m_locatListener);
    }




    /**
     * 无用方法  测试百度地图是否可用
     */
  /*  public void  test(){
        Gson gson=new Gson();

        PoiSearch mPoiSearch = PoiSearch.newInstance();
        OnGetPoiSearchResultListener poiListener = new OnGetPoiSearchResultListener(){
            public void onGetPoiResult(PoiResult result){
                //获取POI检索结果
                LogUtils.LOGE("获取POI检索结果:"+ new Gson().toJson(result).toString());
            }
            public void onGetPoiDetailResult(PoiDetailResult result){
                //获取Place详情页检索结果
                LogUtils.LOGE("获取Place详情页检索结果:"+ new Gson().toJson(result).toString());
            }

            @Override
            public void onGetPoiIndoorResult(PoiIndoorResult poiIndoorResult) {

            }
        };
        mPoiSearch.setOnGetPoiSearchResultListener(poiListener);
        mPoiSearch.searchInCity((new PoiCitySearchOption())
                .city("北京")
                .keyword("美食")
                .pageNum(10));


    }*/



}